package com.company.ljh.medium;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @description:
 * 1657. 确定两个字符串是否接近
 * 如果可以使用以下操作从一个字符串得到另一个字符串，则认为两个字符串 接近 ：
 *
 * 操作 1：交换任意两个 现有 字符。
 * 例如，abcde -> aecdb
 * 操作 2：将一个 现有 字符的每次出现转换为另一个 现有 字符，并对另一个字符执行相同的操作。
 * 例如，aacabb -> bbcbaa（所有 a 转化为 b ，而所有的 b 转换为 a ）
 * 你可以根据需要对任意一个字符串多次使用这两种操作。
 *
 * 给你两个字符串，word1 和 word2 。如果 word1 和 word2 接近 ，就返回 true ；否则，返回 false 。
 * @projectName:leet_code
 * @see:com.company.ljh.medium
 * @author:ljh
 * @createTime:2023/7/3 15:02
 * @version:1.0
 */
public class 确定两个字符串是否接近 {
    public static void main(String[] args) {
        String word1 = "abbzzca";
        String word2 = "babzzca";
        System.out.println(closeStrings(word1,word2));
    }
    //intMap法 ，因为字符串只包含26个小写字母，因此使用intMap保存数量
    public static boolean closeStrings(String word1, String word2) {
        int word1Map[] = new int[26];
        int word2Map[] = new int[26];
        for(char c:word1.toCharArray()){
            word1Map[c-'a']++;
        }
        for(char c:word2.toCharArray()){
            word2Map[c-'a']++;
        }
        //判断两字符串中出现的字符是否相同
        for(int i =0;i < 26;i++){
            if((word1Map[i] > 0 && word2Map[i] ==0) ||(word2Map[i] > 0 && word1Map[i] ==0)){
                return false;
            }
        }
        //判断数量组合是否相同
        Arrays.sort(word1Map);
        Arrays.sort(word2Map);
        for(int i =0;i<word1Map.length;i++){
            if(word1Map[i] != word2Map[i]){
                return false;
            }
        }

        return true;
    }



        //解法1，弱智HashMap法
    public static boolean closeStrings2(String word1, String word2) {
        //翻译：只需要两个字符串长度相等，且a中有的字符b中,且每种数字的数量的组合必须一致
        if(word1.length() != word2.length()){
            return false;
        }
        HashMap<Character,Integer> set = new HashMap();
        HashMap<Character,Integer> set2 = new HashMap();

        for(char c:word1.toCharArray()){
            if(set.containsKey(c)){
                set.put(c,set.get(c)+1);
            }else{
                set.put(c,1);
            }
        }
        for(char c:word2.toCharArray()){
            if(!set2.containsKey(c)&&!set.containsKey(c)){
                return false;
            }
            if(set2.containsKey(c)){
                set2.put(c,set2.get(c)+1);
            }else{
                set2.put(c,1);
            }
        }
        //判断数量组合是否相同
        if(set.size() != set2.size()){
            return false;
        }
        int nums1[] = new int[set.size()];
        int nums2[] = new int[set2.size()];
        int i = 0;
        for(Map.Entry<Character,Integer> entry : set.entrySet()){
            nums1[i++] = entry.getValue();
        }
        i = 0;
        for(Map.Entry<Character,Integer> entry : set2.entrySet()){
            nums2[i++] = entry.getValue();
        }
        return isEqual(nums1,nums2);
    }
    public static boolean isEqual(int[] nums1,int []nums2){
        if(nums1.length != nums1.length){
            return false;
        }
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        for(int i =0;i<nums1.length;i++){
            if(nums1[i] != nums2[i]){
                return false;
            }
        }
        return true;


    }
}
